/*
  学习目标：多泛型变量的使用
  总结：
    1. <T, K>(aa: T,  bb: K)
    2. 多变量之间还可以添加约束条件
*/

// res ={name:}

function fn<T, K>(a: T, b: K): { xxx: T; yyy: K } {
  return {
    xxx: a,
    yyy: b,
  };
}

const result = fn(1, '2'); // result的类型是 {xxx: number, yyy: string}
const result2 = fn([1], ['123']); // result2的类型是 {xxx: number[], yyy: string[]}

//

// 练习2 - 变量间添加约束条件 - key属于obj的键

// 2.1 捕获两个变量
// 2.2 建立约束关系
// keyof T 表示：键名组成的联合范围
// K extends keyof T ，K不仅是个泛型，还是联合类型中的一个
function getValueByName<T, K extends keyof T>(obj: T, key: K) {
  return obj[key];
}

getValueByName(undefined, 'name');

// // 期望：为函数添加类型，
// // 效果：第二个参数能限定取值范围
const res1 = getValueByName({ name1: 'zs', age1: 18 }, 'age1'); // 期望约束第二个参数：取出参数1中的键名
const res2 = getValueByName({ name2: 'zs', age2: 18 }, 'name2'); // 期望约束第二个参数：取出参数1中的键名
const res3 = getValueByName({ name3: 'zs', age3: 18 }, 'age3'); // 期望约束第二个参数：取出参数1中的键名
